#ifndef MQTT_COMM_H
#define MQTT_COMM_H

#include <stdbool.h> // 包含头文件以使用 bool 类型
/**
 * @brief 接收数据结构
 *
 * 对应JSON格式:
 * {
 *   "client_id": "jitri",
 *   "msg_id": "20250827-0001",
 *   "move_type": "absolute",
 *   "parameter": [100],
 *   "option": {
 *     "axis_num": 29
 *   }
 * }
 */
typedef struct {
  char client_id[64]; // 客户端ID
  char msg_id[128];   // 消息ID（类似之前的taskNum）
  char move_type[32]; // 移动类型："absolute" 或 "relative"
  double parameter;   // 目标位置（类似之前的Delta1）
  int axis_num;       // 轴编号，必须为29才执行
} RobotControlData;

/**
 * @brief 发送数据结构 - 实时状态
 *
 * 对应JSON格式:
 * {
 *   "status": 1,
 *   "parameter": [100],
 *   "option": {
 *     "axis_num": 29
 *   }
 * }
 */
typedef struct {
  int status;       // 0:正在运行, 1:运行完毕
  double parameter; // 当前实时位置
  int axis_num;     // 轴编号
} RobotStateData;

/**
 * @brief 应答数据结构
 *
 * 对应JSON格式:
 * {
 *   "msg_id": "20250827-0001",
 *   "status": 1
 * }
 */
typedef struct {
  char msg_id[128]; // 消息ID
  int status;       // 0:正在运行, 1:运行完毕
} RobotAckData;

/* 全局变量：分别存储接收和发送数据 */
extern RobotControlData g_robotControlData;
extern RobotStateData g_robotStateData;

/* 全局标志位：用于通知主循环有新消息到达 */
extern volatile bool g_new_message_flag;

/**
 * @brief 初始化 MQTT 通讯
 * @param broker_address MQTT 服务器地址
 * @param broker_port MQTT 服务器端口
 * @return 0 表示成功，否则返回错误码
 */
int mqtt_comm_init(const char *broker_address, int broker_port);

/**
 * @brief 清理 MQTT 相关资源
 */
void mqtt_comm_cleanup(void);

/**
 * @brief 启动通讯任务
 */
void mqtt_comm_start(void);

/**
 * @brief 发送应答消息（任务完成/运行中）
 * @param msg_id 消息ID
 * @param status 状态：0-运行中，1-完成
 */
void mqtt_send_ack(const char *msg_id, int status);

#endif // MQTT_COMM_H